﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>无标题文档</title>
	<script type="text/javascript">
		if (!document.cookie.match(/blackbird=/)) {
			document.cookie = 'blackbird={pos:0,size:0,load:true};';
		}
	</script>
	<script src="../../Debug/blackbird.js" type="text/javascript" charset="utf-8"></script>
	<link type="text/css" rel="Stylesheet" href="../../Debug/blackbird.css" />
	<script type="text/javascript">
		// 创建数组的基本方式有两种，第一种是使用Array构造函数，如下面的代码所示：
		var colors = new Array();

		// 如果预先知道数组要保存的项目数量，也可以给构造函数传递给数量，得到的数组就会具有那么多的位置（其中每一项的初始值都是undefined）
		var colors1 = new Array(20);

		// 也可以向Array构造函数传递数组中应该包含的项
		var colors2 = new Array('red', 'green', 'blue');

		// 当然，给构造函数传递一个值也可以创建数组，如果传递的是数值，则会按照该数值创建包含给定项数的数组，而如果传递的是其他类型的参数，则会创建包含那个值的只有一项的数组
		var colors3 = new Array(3); // 得到一个包含3项的数组
		var names = Array('gray'); // 创建一个包含一项的数组

		// 另外，在使用Array构造函数是也可以省略new操作符
		var colors4 = Array(3);
		var names1 = Array('gray');

		// 创建数组的第二种方式是使用数组字面量法
		var colors5 = ['red', 'green', 'blue']; // 创建一个包含3项的数组
		var names1 = []; // 创建一个空数组
		var values = [1, 2, ]; // 不要这样！会创建一个包括2或3项的数组
		var options = [, , , , , ]; // 不要这样！会创建一个包括5或6项的数组

		/**
		* 使用数组字面量时，不会调用数组构造函数
		*
		* 数组的length属性不是只读的，通过设置这个属性，可以从数组的末尾移除项或向数组中添加新项
		**/

		// 读取和设置数组的值时，要使用方括号并提供相应值的基于0的数字索引，如下所示：
		var colors6 = new Array('red', 'green', 'blue');
		log.info(colors6[0]); // 显示第一项
		colors6[2] = 'black'; // 修改第三项
		colors6[3] = 'brown'; // 新增第四项

		// 利用length属性可以方便的在数组末尾添加新项
		var colors7 = new Array('red', 'green', 'blue');
		colors7[colors7.length] = 'black';
		colors7[colors7.length] = 'brown';

		colors7[99] = 'gray';
		log.info(colors7.length); // return 100

		// 转换方法，所有对象都具有toLocaleString()、toString()、valueOf()方法，
		// 调用数组的toString()返回每个值的字符串形式拼接而成的一个以逗号分隔的字符串，实际上，为了创建这个字符串会调用数组每一项的toString()
		// toLocaleString方法调用数组每一项的toLocaleString()
		log.info(colors6.toLocaleString()); 	// red,green,black,brown
		log.info(colors6.toString()); 				// red,green,black,brown
		log.info(colors6.valueOf()); 				// redgreenblackbrown
		log.info(colors6); 									// redgreenblackbrown

		// 使用join()方法，可以添加不同的分隔符
		log.info(colors6.join('.'));
		log.info(colors6.join('||'));

		/**
		* 如果数组中的某一项的值是null或undefined，那么改值在join()、toLocaleString()、toString()、valueOf()方法返回的结果中以空字符串表示
		**/

		/** 栈方法，栈是一种LIFO(last-in-first-out,后进先出)的数据结构，也就是最新添加的项最早被移除，而栈中项的插入（叫做推入）和移除（叫做弹出），
		* 只发生在一个位置，栈的顶部，ECMAScript为数组专门提供了push()和pop()方法以便实现类似栈的行为。
		*
		* push()方法可以接收任意数量的参数，把它们逐个添加到数组末尾，并返回修改后数组的长度。
		* 而pop方法则从数组末端移除最后一项，同时将数组长度减1，然后返回移除的项。
		**/
		var colors = new Array();
		colors.push('red', ['aaa', ['bbb']], 'green');
		log.info(colors.length); // 3
		log.info(colors.pop()); // return 'green'

		/**
		* 队列数据结构的访问规则是FIFO(first-in-first-out，先进先出)。队列在列表的末端添加项，从列表的前端移除项，
		* 结合shift()方法和push()方法实现类似队列的行为。
		*
		* shift()方法能够移除数组中的第一个项并返回该项，同时将数组长度减1
		* unshift()方法能在数组前端添加任意个项并返回新数组的长度，因此，同时使用unshift()和pop方法可以冲相反的方向来模拟队列，即在数组的前端添加项，冲数组末端移除项
		*
		* unshift()方法在IE下返回undefined而不是数组的长度
		**/
		var item = colors.shift();

		/**
		* reverse()反转数组中项的顺序
		**/
		log.info(colors6.reverse());

		/**
		* concat()方法可以基于当前数组中的所有项创建一个新数组
		* 在没有给concat()方法传递参数的情况下，他只是复制当前数组并返回副本。
		* 如果传递给concat()方法的是一或多个数组，则该方法会将这些数组中的每一项都添加到新的数组中
		* 数组中嵌套的数组则作为一项被插入
		**/
		var temp = ['aaa', 'bbb', 'ccc'];
		var newtemp = temp.concat('ddd', ['eee', ['fff', 'ggg']]);
		log.info(newtemp.join(',')); // return 'aaa', 'bbb', 'ccc','ddd','eee','fff'
		log.info(newtemp.length); // 6

		/**
		* slice()方法能够基于当前数组中的一或多个项创建一个新数组，可以接收一或两个参数，既要返回项的起始和结束位置。
		* 在只有一个参数的情况下，返回该参数指定位置开始到当前数组末尾的所有项
		* 如果有两个参数，返回起始和结束位置之间的项
		* 如果参数中有一个为负数，则用数组长度加上该参数值来确定相应的位置，例如一个包含5项的数组上调用slice(-2,-1)与调用slice(3,4)得到的结果相同
		* 如果结束为止小于起始位置，则返回空数组
		**/
		var colors = ['red', 'green', 'blue', 'black', 'brown'];
		var colors2 = colors.slice(1);
		var colors3 = colors.slice(1, 4);
		log.info(colors2.join(',')); // 'green', 'blue', 'black', 'brown'
		log.info(colors3.join(',')); // 'green', 'blue', 'black'
		var colors4 = colors.slice(-8, 3);
		log.info(colors4.join(',')); // 'red', 'green', 'blue'

		/**
		* splice()方法的主要用途是想数组的中部插入项，使用方法有三种：
		* 删除----可以删除任意数量的项，只需指定2个参数，要删除的第一项的位置和要删除的项数
		* 插入----可以在指定位置插入任意数量的项，只需指定3个参数：起始位置、0(要删除的项数)、要插入的项
		* 替换----可以向指定位置插入任意数量的项，同时删除任意数量的项，只需指定3个参数：起始位置、要删除的项数、要插入的项
		* splice()方法始终都会返回一个数组，该数组中办函从原始数组中删除的项，如果没有删除任何项，则返回空数组
		* 如果插入的项中包含数组，则数组作为一个项被插入
		**/
		var colors = ['red', 'green', 'blue'];
		var removed = colors.splice(0, 1); // 删除第一项
		log.info(colors.toString()); // 'green', 'blue'
		log.info(removed.toString()); // 'red'

		removed = colors.splice(1, 0, 'yellow', 'orange', ['aaa', ['bbb']]); // 从位置1开始插入
		log.info(colors.toString()); // 'green', 'yellow', 'orange', 'aaa', 'bbb', 'blue'
		log.info(colors.length); // 5，此时数组作为一个项被插入
		log.info(removed.toString()); // 空数组

		removed = colors.splice(1, 1, 'red', 'purple'); // 插入两项，删除一项
		log.info(colors.toString()); // 'green', 'red', 'purple', 'orange', 'aaa', 'bbb', 'blue'
		log.info(removed.toString()); // 'yellow'
		log.info(colors.length); // 6
	</script>
</head>
<body>
</body>
</html>
